home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1997 January / macformat46.iso / Demos / PowerFantasm 4.15 / Beginners guide / GUIDE EXAMPLES / EXAMPLE12.S < prev    next >
Encoding:
Text File  |  1996-06-21  |  2.8 KB  |  79 lines

  1. ********************************************************************************
  2. *EXAMPLE 12 - Vertical scroll down demonstration FOR BEGINNERS GUIDE TO MAC MC *
  3. *AUTHOR    - STUART BALL JULY 94                                               *
  4. *SCREEN MUST BE SET TO 16  COLOUR MODE FOR THIS EXAMPLE                        *
  5. ********************************************************************************
  6. SCREENROW:    EQU    $0106    WIDTH OF EAch screen line
  7. DEVICELIST:    EQU    $08A8    THE ADDRESS OF DEVICELIST
  8. gdPMap_offset:    EQU    22
  9. DIST:    EQU    2    VERTICAL SCROLL STEP IN PIXELS
  10.  
  11. EXAMPLE11:    MOVEM.L    A5-A6,-(SP)    SAVE MAC WORLD
  12.     BSR    INIT    INITIALISE OUR VARIABLES
  13.     
  14.     MOVE.L    #49,D0
  15. SCROLL_IT:    BSR    SCROLL_DOWN    SCROLL THE SCREEN DOWN BY DIST PIXELS
  16.     DBRA    D0,SCROLL_IT    50 TIMES
  17.     
  18.     MOVEM.L    (SP)+,A5-A6    RESTORE MAC WORLD
  19.     RTS
  20. ************************END OF EXAMPLE 12***************************************
  21. **INIT SETS UP OUR VARIABLES
  22. INIT:    LEA    MY_VARS(PC),A6    A6 IS OUR VARIABLE POINTER
  23.     MOVE.L    DEVICELIST,A0
  24.     MOVE.L    (A0),A0    POINT TO DEVICELIST
  25.     MOVE.L    A0,A1    COPY ADDRESS OF DEVICE LIST
  26.     MOVE.L    gdPMap_offset(A1),A1    A1=POINTER TO GDPMAP
  27.     MOVE.L    (A1),A1        gdPMap IN A1
  28.     MOVE.W    12(A1),LINE_LENGTH(A6)    MAX X OF SCREEN
  29.     MOVE.W    10(A1),NUMB_OF_LINES(A6)    MAX Y OF SCREEN
  30.     MOVE.L    (A1),VRAM_ADDR(A6)    SAVE VRAM ABSOLUTE ADDRESS
  31.     RTS
  32.  
  33. **SCROLL_DOWN_8 SCROLLS THE SCREEN DOWN BY 8 PIXELS
  34. **EXPECTS VRAM_ADDR,NUMB_OF_LINES AND LINE_LENGTH TO BE SET UP.    
  35. SCROLL_DOWN:    MOVEM.L    D2-D7/A0-A1,-(SP)    SAVE REGS
  36.     MOVE.L    VRAM_ADDR(A6),A0    START OF VRAM
  37.     MOVE.W    SCREENROW,D7    PHYSICAL LENGTH OF LINES
  38.     EXT.L    D7
  39.     MOVE.W    NUMB_OF_LINES(A6),D6    LINES ON SCREEN
  40.     EXT.L    D6
  41.     MULS    D7,D6    D6 = LAST LINE ON SCREEN
  42.     CLR.L    D5    FOR LINE_LENGTH
  43.     MOVE.W    LINE_LENGTH(A6),D5
  44.     LSR.L    #1,D5    DIVIDE BY 2 AS EACH PIXEL IS 4 BITS
  45.     ADD.L    D5,D6    D6 = LAST PIXEL ON SCREEN (BOT RIGHT)
  46.     MOVE.L    D6,A1
  47.     ADD.L    A0,A1    A1=PHYSICAL VRAM ADDR OF LAST PIXEL
  48.     MOVE.L    A1,A0    
  49.  
  50.     MOVE.L    D7,D3    SCREENROW
  51.     SUB.L    D5,D3    SCREENROW-LINE_LENGTH
  52.     
  53.     MULU    #DIST,D7    SCREENROW * SCROLL STEP
  54.     SUB.L    D7,A0    A0 = LAST PIXEL OF SOURCE LINE
  55.  
  56.     MOVE.W    NUMB_OF_LINES(A6),D2    CALCULATE NUMBER OF
  57.     EXT.L    D2    LINES TO SCROLL
  58.     SUB.L    #DIST+1,D2    DIST PLUS 1 FOR DBRA
  59.     
  60. SCROLL:    MOVE.L    D5,D4    LINE LENGTH IN BYTES
  61.     LSR.L    #2,D4    DIVIDED BY 4 FOR LONGS
  62.     SUBQ.L    #1,D4    CAUSE DBRA ALWAYS LOOPS ONE MORE THAN COUNT
  63. COPY_LINE:    MOVE.L    -(A0),-(A1)    MOVE SOURCE LINE TO DESTINATION LINE
  64.     DBRA    D4,COPY_LINE    UNTIL ALL LONGS HAVE BEEN MOVED
  65.     
  66.     SUB.L    D3,A0
  67.     SUB.L    D3,A1    POINT TO NEXT LINE
  68.     DBRA    D2,SCROLL    MOVE ALL LINES
  69.     
  70.     MOVEM.L    (SP)+,D2-D7/A0-A1    RESTORE REGS
  71.     RTS
  72.     
  73. *********************************VARIABLES FOLLOW********************************
  74. MY_VARS:    DS.B    20    SPACE FOR OUR VARIABLES
  75.  
  76. ******************************OFFSETS INTO VARIABLES*****************************
  77. NUMB_OF_LINES:    RS.W    1    NUMBER OF PHYSICAL LINES ON SCREEN    
  78. VRAM_ADDR:    RS.L    1    ABSOLUTE ADDRESS OF VRAM
  79. LINE_LENGTH:    RS.L    1    ACTUAL LENGTH OF EACH SCREEN LINE